/********************************************************************************
 * Copyright (c) 2021,2022 Contributors to the CatenaX (ng) GitHub Organisation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Apache License, Version 2.0 which is available at
 * https://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 ********************************************************************************/

import { AfterViewInit, Component, EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core';
import { SidenavService } from '@layout/sidenav/sidenav.service';
import { State } from '@shared/model/state';

// INFO: Tests for Sidenav wrapper are written within sidenav.component.spec.ts.
@Component({
  selector: 'app-sidenav-wrapper',
  templateUrl: './sidenav-wrapper.component.html',
})
export class SidenavWrapperComponent implements AfterViewInit {
  @ViewChild('templateRef') templateRef: TemplateRef<HTMLElement>;
  @Output() sidenavAction = new EventEmitter<boolean>();

  @Input()
  public set isOpen(isOpen: boolean) {
    this.isOpen$.update(isOpen);

    if (this.templateRef) {
      this.configureSidenav();
    }
  }

  private readonly isOpen$ = new State(false);

  constructor(private readonly sidenavService: SidenavService) {}

  public ngAfterViewInit(): void {
    if (this.isOpen$.snapshot) {
      this.configureSidenav();
    }
  }

  private configureSidenav(): void {
    this.sidenavService.setConfig({
      template: this.templateRef,
      action: this.sidenavAction,
      isOpen: this.isOpen$.snapshot,
    });
  }
}
